/*
 * @Author: Jiraiya
 * @Date: 2020-02-29 18:30:37
 * @LastEditors: Jiraiya
 * @LastEditTime: 2020-02-29 22:01:33
 * @Description: 
 */

 const l = console.log
 //🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

 // 二 八 十六进制的表示
 l(Number('0b11')) // 3
 l(Number('0o11')) // 9
 l(Number('0x11')) // 17

 // 是否是有限数
 l(Number.isFinite(1)) // true
 l(Number.isFinite(Infinity)) // false
 l(Number.isFinite(-Infinity)) // false
 l(Number.isFinite('')) // false

 // 是否是NaN
 l(Number.isNaN(NaN)) // true
 l(Number.isNaN('')) // false
 l(Number.isNaN(2)) // false

 // 解析数字
 l(Number.parseInt === parseInt) // true
 l(Number.parseFloat === parseFloat) // true
 l(Number.parseInt('11.22')) // 11
 l(Number.parseFloat('11.22.11')) // 11.22

 // 判断是整数
 l(Number.isInteger(2)) // true
 l(Number.isInteger(-2)) // true

 // js浮点型和整型存储方式一样
 l(Number.isInteger(2.0)) // true
 
 l(Number.isInteger(2.1)) // false
 
 // 超过精度被误判
 l(Number.isInteger(3.0000000000000001)) // true

 //🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

 // 最小精度误差
 l(Number.EPSILON === Math.pow(2, -52)) // true
 l(0.1 + 0.2 - 0.3 < Number.EPSILON) // true

 // 可以用来判断误差精度 误差只要小于2^-50 就算相等
 function withErrorMargin(left, right){
    return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2)
 }
 l(withErrorMargin(0.1 + 0.2, 0.3)) // true

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

// -2^53 < 安全整数 < 2^53
 l(Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1) // true
 l(Number.MIN_SAFE_INTEGER === - Math.pow(2, 53) + 1) // true
 l(Number.isSafeInteger(Math.pow(2, 53))) // false

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

const {trunc, sign, cbrt, hypot} = Math;

// 返回整数部分
l(trunc(0.1), trunc(2.2), trunc(-2.5)) // 0 2 -2

// 判断一个数是正数 负数 或者 0
l(sign(-1), sign(-0.1), sign(2), sign(0), sign(-0), sign(+0))
// -1 -1 1 0 -0 0

// 求立方根
l(cbrt(8)) // 2

// 返回所有数平方和的平方根
l(hypot(3, 4)) // 5

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

// 求数字的前导零
Math.clz32()

// Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果
Math.imul()

// Math.fround方法返回一个数的32位单精度浮点数形式
Math.fround()

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

// Math.expm1(x)返回 ex - 1，即Math.exp(x) - 1。
Math.expm1(x)

// Math.log1p(x)方法返回1 + x的自然对数，即Math.log(1 + x)。如果x小于-1，返回NaN。
Math.log1p(x)

// Math.log10(x)返回以 10 为底的x的对数。如果x小于 0，则返回 NaN。
Math.log10(x)

// Math.log2(x)返回以 2 为底的x的对数。如果x小于 0，则返回 NaN。
Math.log2(x)

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏
Math.sinh(x) 返回x的双曲正弦（hyperbolic sine）
Math.cosh(x) 返回x的双曲余弦（hyperbolic cosine）
Math.tanh(x) 返回x的双曲正切（hyperbolic tangent）
Math.asinh(x) 返回x的反双曲正弦（inverse hyperbolic sine）
Math.acosh(x) 返回x的反双曲余弦（inverse hyperbolic cosine）
Math.atanh(x) 返回x的反双曲正切（inverse hyperbolic tangent）

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏

// 指数运算符  从右往左运算
l(2 ** 2) // 4
l(2 ** 3 ** 2 === Math.pow(2, 9)) // true

//🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏🙏
//bigInt大精度整数
l(typeof 1n) // bigint

l(BigInt('9999999999999999999999999999999999999999999999') + 1n)
// 10000000000000000000000000000000000000000000000n